package com.sh.rbac.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sh.rbac.domain.dto.user.*;
import com.sh.rbac.domain.entity.User;

import java.util.Map;

/**
 * @author lucky
 * @description 针对表【sys_user(用户表)】的数据库操作Service
 * @createDate 2024-04-04 21:47:19
 */
public interface UserService extends IService<User> {

    /**
     * 登录
     *
     * @param loginDTO 登录对象
     * @return 登录结果
     */
    Map<String, Object> login(LoginDTO loginDTO);


    /**
     * 退出登录
     *
     * @return 是否退出成功
     */
    Boolean logout();


    /**
     * 获取用户信息
     *
     * @param token token
     * @return 用户对象
     */
    User getInfo(String token);


    /**
     * 获取验证码
     *
     * @param randomStr 随机字符串
     * @return 验证码字符串
     */
    String captcha(String randomStr);


    /**
     * 根据id查询用户
     *
     * @param id 用户ID
     * @return 用户对象
     */
    User getById(Long id);


    /**
     * 分页查询用户
     *
     * @param current      当前页
     * @param limit        每页显示条数
     * @param userQueryDTO 查询条件
     * @return 分页查询结果
     */
    Page<User> getPage(Long current, Long limit, UserQueryDTO userQueryDTO);


    /**
     * 保存用户
     *
     * @param userSaveDTO 用户保存对象
     * @return 是否保存成功
     */
    Boolean save(UserSaveDTO userSaveDTO);


    /**
     * 更新用户
     *
     * @param userUpdateDTO 用户更新对象
     * @return 是否更新成功
     */
    Boolean updateById(UserUpdateDTO userUpdateDTO);


    /**
     * 更新用户密码
     *
     * @param userUpdatePwdDTO 用户密码更新对象
     * @return 是否更新成功
     */
    Boolean updatePassword(UserUpdatePwdDTO userUpdatePwdDTO);


    /**
     * 更新用户信息
     *
     * @param userProfileDTO 用户信息更新对象
     * @return 是否更新成功
     */
    Boolean updateProfile(UserProfileDTO userProfileDTO);


    /**
     * 重置密码
     *
     * @param id 用户ID
     * @return 是否重置成功
     */
    Boolean resetPassword(Long id);


    /**
     * 分配角色
     *
     * @param assignRoleDTO 分配角色对象
     * @return 是否分配成功
     */
    Boolean assignRole(AssignRoleDTO assignRoleDTO);


    /**
     * 更新用户状态
     *
     * @param id     用户ID
     * @param status 用户状态
     * @return 是否更新成功
     */
    Boolean updateStatus(Long id, Integer status);
}
